package log

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"path/filepath"
)

var Logger *zap.Logger

// InitLogger 初始化日志记录器
func InitLogger() *zap.Logger {
	exePath, _ := os.Executable()
	rootPath := filepath.Dir(exePath)

	// 创建一个 Lumberjack 实例，用于日志切割
	logPath := rootPath + "/logs/app.log"

	logFile := &lumberjack.Logger{
		Filename:   logPath, // 日志文件名
		MaxSize:    1,       // 日志文件的最大大小（以MB为单位）
		MaxBackups: 30,      // 保留的旧日志文件的最大数量
		MaxAge:     30,      // 保留的旧日志文件的最大天数
		Compress:   false,   // 是否启用日志压缩
	}

	// 创建一个 Zap 的 EncoderConfig，用于配置日志的编码格式
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "caller",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder, // 将日志级别转换为小写
		EncodeTime:     zapcore.ISO8601TimeEncoder,    // 使用ISO8601格式输出时间
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeCaller:   zapcore.ShortCallerEncoder,
	}

	// 创建一个 Zap 的 Encoder
	encoder := zapcore.NewJSONEncoder(encoderConfig)

	// 创建一个 LumberjackSink，用于将日志写入到文件
	lumberjackSink := zapcore.AddSync(logFile)

	// 创建一个 Zap 的 Core，将日志写入到文件
	core := zapcore.NewCore(encoder, lumberjackSink, zapcore.DebugLevel)

	// 创建一个 Zap 的 Logger 实例，使用上面创建的 Core
	logger := zap.New(core)

	return logger
}

// init 在包初始化时初始化日志记录器
func init() {

	Logger = InitLogger()
}
